﻿using Microsoft.Win32;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Shapes;

namespace 大赛计时器
{
    /// <summary>
    /// 设置器.xaml 的交互逻辑
    /// </summary>
    public partial class 设置器 : Window
    {
        static bool 加载完毕 = false;
        static string 窗口状态 = "还原";
        设定集 设定;
        #region 委托主界面
        public delegate void 关闭程序();
        public 关闭程序 关闭;
        public delegate void 添加主线程();
        public 添加主线程 开始计时线程;
        public delegate void 暂停程序();
        public 暂停程序 暂停计时;
        public delegate void 切换移动控件();
        public 切换移动控件 切换控件;
        #endregion
        public 设置器(设定集 传入设定集)
        {
            InitializeComponent();
            Thread 窗体更新线程 = new Thread(窗体更新);
            设定 = 传入设定集;
            窗体更新线程.Start();
            倒计时间.SelectedTime = DateTime.Parse("00:00:00");
            结束提示音路径.Text = 设定.结束声音文件路径;
            将近提示音路径.Text = 设定.提醒声音文件路径;

        }

        public void 初始化界面()
        {
            倒计时间.SelectedTime = DateTime.Parse("00:00:00");
            结束提示音路径.Text = "";
            将近提示音路径.Text = "";
            将近时长.Text = "";
            更新频率.Text = "";
            
        }

        public void 窗体更新()
        {
            while (设定.程序运行 == true) 
            {
                if (设定.剩余时间 == null) { continue; }
                Dispatcher.BeginInvoke((Action)(() => {
                    状态.Text = $"当前状态：{设定.状态.ToString()}";
                    剩余时间显示器.Text = 设定.剩余时间.ToString(@"hh\:mm\:ss");
                }));
                Thread.Sleep(500);
            }
        
        }

        public void 提交并启动()
        {
            设定.开始时间 = DateTime.Now;
            设定.结束时间 = DateTime.Now.Add(倒计时间.SelectedTime.Value.TimeOfDay);
            设定.提醒时间 = Convert.ToInt32(将近时长.Text);
            设定.状态 = 设定集.当前计时状态.正在进行;
            设定.已完成提醒 = false;
            设定.结束声音文件路径 = 结束提示音路径.Text;
            设定.提醒声音文件路径 = 将近提示音路径.Text;
            if (!System.IO.File.Exists(设定.结束声音文件路径)) { MessageBox.Show("音频不可用", "找不到结束声音");return; }
            if (!System.IO.File.Exists(设定.提醒声音文件路径)) { MessageBox.Show("音频不可用", "找不到临近提醒声音"); return; }
            try
            {
                设定.更新间隔 = Convert.ToInt32(更新频率.Text);
            }
            catch
            {
                设定.更新间隔 = 设定.更新间隔;
            }
            开始计时线程();

        }

        #region 窗口控制
        //以下是控制窗体所需代码
        private void 关闭按钮_Click(object sender, RoutedEventArgs e)
        {
            加载完毕 = false;
            关闭();
            this.Close();

        }

        private void 最大化按钮_Click(object sender, RoutedEventArgs e)
        {
            if (窗口状态 == "还原")
            {
                this.WindowState = WindowState.Maximized;
                窗口状态 = "最大化";
                最大化按钮.Content = "❏";
            }
            else
            {
                this.WindowState = WindowState.Normal;
                窗口状态 = "还原";
                最大化按钮.Content = "▢";
            }
        }

        private void 最小化按钮_Click(object sender, RoutedEventArgs e)
        {
            WindowState = WindowState.Minimized;
        }
        #endregion

        private void 清空按钮_Click(object sender, RoutedEventArgs e)
        {
            初始化界面();
            设定.状态 = 设定集.当前计时状态.已停止;
        }

        private void 提交按钮_Click(object sender, RoutedEventArgs e)
        {
            if (设定.状态 == 设定集.当前计时状态.正在进行 || 设定.状态 == 设定集.当前计时状态.正在进行且即将结束)
            {
                设定.状态 = 设定集.当前计时状态.已停止;
                设定.已完成提醒 = false;
                return;
            }

            try
            {
                提交并启动();
            }
            catch
            {
                MessageBox.Show("错误", "输入的信息不正确，请检查后再试。");
                return;
            }


        }

        private void 结束音频浏览按钮_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog 选择打开路径 = new OpenFileDialog();
            选择打开路径.Title = "请选择要使用的音乐文件";
            选择打开路径.AddExtension = true;
            选择打开路径.DefaultExt = "mp3";
            选择打开路径.Filter = "第三代音频格式(*.mp3)|*.mp3";
            选择打开路径.ShowDialog();
            结束提示音路径.Text = 选择打开路径.FileName;
        }

        private void 将近音频浏览按钮_Click(object sender, RoutedEventArgs e)
        {
            OpenFileDialog 选择打开路径 = new OpenFileDialog();
            选择打开路径.Title = "请选择要使用的音乐文件";
            选择打开路径.AddExtension = true;
            选择打开路径.DefaultExt = "mp3";
            选择打开路径.Filter = "第三代音频格式(*.mp3)|*.mp3";
            选择打开路径.ShowDialog();
            将近提示音路径.Text = 选择打开路径.FileName;
        }

        private void 更新设定时间_Click(object sender, RoutedEventArgs e)
        {
            设定.结束时间 = 设定.开始时间.Add(倒计时间.SelectedTime.Value.TimeOfDay);
            if (将近时长.Text.Length != 0)
            {
                设定.提醒时间 = Convert.ToInt32(将近时长.Text);
            }
        }

        private void 显示拖动控件_Click(object sender, RoutedEventArgs e)
        {
            切换控件();
        }
    }
}
